数据类型类 DataTypes 及其API
在使用sequelize.define方法定义模型时,我们一般会为模型属性(列)指定类型type,它表示数据类型,Sequelize会按指定的类型在数据库中创建字段。这些类型被定义到了sequelize模块的DataTypes类中,它是一个静态类可以直接引用其属性或方法。
DataTypes类
DataTypes类中的API
2.1 STRING() - 变长字符串
2.2 CHAR() - 定长字符串
2.3 TEXT() - 指定为文本列
2.4 INTEGER() - 整型
2.5 BIGINT() - 长整型
2.6 FLOAT() - 浮点数
2.7 REAL() - 浮点数
2.8 DOUBLE() - 双精度浮点数
2.9 DECIMAL() - 小数
2.10 BOOLEAN() - 布尔
2.11 TIME() - 时间类型
2.12 DATE() - 日期时间类型
2.13 DATEONLY() - 日期类型
2.14 HSTORE() - 键/值类型
2.15 JSON() - JSON字符串类型
2.16 JSONB() - JSONB类型
2.17 NOW() - 时间默认值
2.18 BLOB() - 二进制类型
2.19 RANGE() - Range类型
2.20 UUID() - UUID类型
2.21 UUIDV1() - UUID v1 默认值
2.22 UUIDV4() - UUID v4 默认值
2.23 VIRTUAL() - 虚拟值
2.24 ENUM() - 枚举
2.25 ARRAY() - 数组
2.26 GEOMETRY() - 几何类型
2.27 GEOGRAPHY() - 地理类型
1. DataTypes类
DataTypes是一个含有常用数据类型的类,它用于使用sequelize.define()方法定义模型时指定列的数据类型:
sequelize.define('model', { column: DataTypes.INTEGER })
注意:我们也可以通过模块的顶级对象Sequelize来引用指定的类型,如Sequelize.INTEGER,这种只是对DataTypes类中相关属性的一个便捷引用,其本质上还是引用了DataTypes类中相关属性。
在定义模型时,我们可以简单的传入一个字符串表示数据类型,但更多的时候是使用类型定义。如,使用DataTypes.BLOB时,Sequelize获取后会返回一个Buffer实例。
某些数据类型具有可访问的特殊属性,以便更改数据类型。如,与要补零得到一个无符号整数,可以使用DataTypes.INTEGER.UNSIGNED.ZEROFILL。
为数据类型指定长度时,可以像函数一样引用:INTEGER(2)。
NOW、UUIDV1、UUIDV4这三个是用于指定默认值,所以不能用于类型定义。如,定义一个UUID类型并指定默认值为v1版本的uuid:
sequelize.define('model', { uuid: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV1, primaryKey: true } })
如果想想自己的算法生成自定义的UUID默认值,可以为defaultValue指定一个返回UUID的函数:
sequelize.define('model', { uuid: { type: DataTypes.UUID, defaultValue: function() { return generateMyId() }, primaryKey: true } })
2. DataTypes类中的API
2.1 STRING() - 变长字符串
STRING() STRING(64)
将字段指定为变长字符串类型。默认长度为 255
可用属性:BINARY
2.2 CHAR() - 定长字符串
CHAR() CHAR(64)
将字段指定为定长字符串类型。默认长度为 255
可用属性:BINARY
2.3 TEXT() - 指定为文本列
TEXT()
将字段指定为(无)有限长度的文本列。可用长度:tiny, medium, long
2.4 INTEGER() - 整型
INTEGER()
32位整型
可用属性:UNSIGNED,ZEROFILL
2.5 BIGINT() - 长整型
BIGINT()
64位整型
可用属性:UNSIGNED,ZEROFILL
2.6 FLOAT() - 浮点数
FLOAT()
4位精度的浮点数,接受一个或两个参数表示精度
可用属性:UNSIGNED,ZEROFILL
2.7 REAL() - 浮点数
REAL()
4位精度的浮点数,接受一个或两个参数表示精度
可用属性:UNSIGNED,ZEROFILL
2.8 DOUBLE() - 双精度浮点数
DOUBLE()
8位精度的浮点数,接受一个或两个参数表示精度
可用属性:UNSIGNED,ZEROFILL
2.9 DECIMAL() - 小数
DECIMAL()
小数,接受一个或两个参数表示精度
可用属性:UNSIGNED,ZEROFILL
2.10 BOOLEAN() - 布尔
BOOLEAN()
小数,接受一个或两个参数表示精度
2.11 TIME() - 时间类型
TIME()
指定为时间类型列
2.12 DATE() - 日期时间类型
DATE()
指定为日期时间类型列
2.13 DATEONLY() - 日期类型
DATEONLY()
指定为日期类型列
2.14 HSTORE() - 键/值类型
HSTORE()
指定为键/值类型列,仅Postgres适用
2.15 JSON() - JSON字符串类型
JSON()
指定为JSON字符串类型列,仅Postgres适用
2.16 JSONB() - JSONB类型
JSONB()
指定为预处理的JSON数据列,仅Postgres适用
2.17 NOW() - 时间默认值
NOW()
一个表示当前时间戳的默认值
2.18 BLOB() - 二进制类型
BLOB()
二进制存储类型,可用长度:tiny, medium, long
2.19 RANGE() - Range类型
RANGE()
Range类型是表示某种元素类型的值范围的数据类型,仅Postgres适用
2.20 UUID() - UUID类型
UUID()
UUID类型列,其默认值可以为UUIDV1或UUIDV4
2.21 UUIDV1() - UUID v1 默认值
UUIDV1()
设置UUID类型列,的默认值为 UUID v1
2.22 UUIDV4() - UUID v4 默认值
UUIDV4()
设置UUID类型列,的默认值为 UUID v4
2.23 VIRTUAL() - 虚拟值
VIRTUAL()
一个不存储在数据库中的虚拟值。这种列在类型在需要提供一个默认值,但又不需要将其存储到数据库中时很适用。
也可以用于在重新排列和存储前进行验证。如,对密码做哈希运算前进行长度验证:
sequelize.define('user', { password_hash: DataTypes.STRING, password: { type: DataTypes.VIRTUAL, set: function (val) { this.setDataValue('password', val); this.setDataValue('password_hash', this.salt + val); }, validate: { isLongEnough: function (val) { if (val.length < 7) { throw new Error("Please choose a longer password") } } } } })
在上面代码中,密码字段是存在的所以可以进行验证,但由于是虚拟类型,并不会将其存入数据库中。
别名:NONE
2.24 ENUM() - 枚举
ENUM() DataTypes.ENUM('value', 'another value')
枚举类型
2.25 ARRAY() - 数组
ARRAY() DataTypes.ARRAY(DataTypes.DECIMAL)
数组类型,仅Postgres适用
2.26 GEOMETRY() - 几何类型
ARRAY() DataTypes.ARRAY(DataTypes.DECIMAL)
几何类型,仅Postgres(PostGIS)及MySQL适用。在MySQL中可用的几何类型有:'POINT'、'LINESTRING'、'POLYGON'
使用时,GeoJSON是可用的输入和返回值。
在PostGIS中,GeoJSON通过PostGIS函数ST_GeomFromGeoJSON进行转换;而在MySQL中使用GeomFromText函数。
// 创建一个点: var point = { type: 'Point', coordinates: [39.807222,-76.984722]};
User.create({username: 'username', geometry: point }).then(function(newUser) { ... });
// 创建一个新的线: var line = { type: 'LineString', 'coordinates': [ [100.0, 0.0], [101.0, 1.0] ] };
User.create({username: 'username', geometry: line }).then(function(newUser) { ... });
// 创建一个几何: var polygon = { type: 'Polygon', coordinates: [ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ] ]};
User.create({username: 'username', geometry: polygon }).then(function(newUser) { ... });
// 使用自定义的 SRID 创建点: var point = { type: 'Point', coordinates: [39.807222,-76.984722], crs: { type: 'name', properties: { name: 'EPSG:4326'} } };
User.create({username: 'username', geometry: point }).then(function(newUser) { ... });
2.27 GEOGRAPHY() - 地理类型
GEOGRAPHY()